package com.java.IO.convert_stream;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class InputStreamReaderAPI {
    public static void useInputStreamReader(String path, String encode) throws IOException {
        // 创建对象：创建规则主要依赖于构造形参InputStream的子类。参数2为字符集，默认UTF-8
        InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(path), encode);
        
        // read：读取目标地内数据，若无参数则一次读取一字符，若无数据则返回-1。若参数为字符数组且有数据则一次性读取字符数组长度的字符并存于该字符数组内同时返回读取到的字符长度
        System.out.println(inputStreamReader.read()); // 97
        System.out.println(inputStreamReader.read()); // 57
        System.out.println(inputStreamReader.read()); // 20013 (十进制数)
        System.out.println((char) inputStreamReader.read()); // 中 (强转)
        System.out.println(inputStreamReader.read()); // 13
        System.out.println(inputStreamReader.read()); // 10
        char[] chars = new char[20];
        System.out.println(inputStreamReader.read(chars, 13, 2)); // 2
        System.out.println(Arrays.toString(chars)); // [ ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  , a, 哈,  ,  ,  ,  ,  ] (读取2个数据到数组指定位置13)
        System.out.println(inputStreamReader.read(chars)); // 14
        System.out.println(Arrays.toString(chars)); // [c, d, d, e, 啊, 啊, 啊, H, e, l, l, o, H, e, 哈,  ,  ,  ,  ,  ] (残留数据哈)
        System.out.println(inputStreamReader.read(chars)); // -1
        System.out.println(Arrays.toString(chars)); // [c, d, d, e, 啊, 啊, 啊, H, e, l, l, o, H, e, 哈,  ,  ,  ,  ,  ] (全都是残留数据)
        System.out.println(inputStreamReader.read()); // -1
        
        // getEncoding：获取当前流字符集
        System.out.println(inputStreamReader.getEncoding());
        
        // close：关闭流并释放资源
        inputStreamReader.close();
    }
    
    public static void main(String[] args) throws IOException {
        // 读出来不乱码，因为读的字符集与存的相同。不乱码的输出在方法注释内
        useInputStreamReader("File和IO流\\com\\java\\files\\convert_stream_utf8.txt", "UTF-8");
        // 读出来不乱码，因为读的字符集与存的相同。不乱码的输出在方法注释内
        useInputStreamReader("File和IO流\\com\\java\\files\\convert_stream_gbk.txt", "GBK");
        // 读出来乱码，因为读的字符集与存的不相同
        useInputStreamReader("File和IO流\\com\\java\\files\\convert_stream_gbk.txt", "UTF-8");
    }
}
